package GUI;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JViewport;

import Controleur.GestionnaireSimulateur;
import Controleur.SimulationListener;
import Domaine.Noeud;
import Domaine.Segment;
import Domaine.VehiculeUrgence;
import Erreurs.ObjetExistantError;

/**
 * 
 * @author Noyau
 * @version 1.0
 * @since 2013-11-12
 * File GrilleMagnetique.java
 *
 */
public class GrilleMagnetique extends JPanel implements  MouseListener, MouseMotionListener, MouseWheelListener
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 3184667274488564368L;
	/*
	 * 
	 * Attributs
	 * 
	 */
	private Boolean _displayGrid = false;
	
	private int COL; // Nombre de colonne de la grille.
	private int ROWS; // Nombre de lignes de la grille.
	
	private int H = 10; // Hauteur du noeud
	private int L = 10;  // Largeur du Noeud
	
	private int hDist; // Distance verticale entre deux lignes
	private int lDist; // Distance horizontale entre deux colonnes.
	//private ArrayList<Rectangle> nodes; // Tableau contenant les repr�sentation graphiques des noeuds.
	
	private Noeud oNode = null; // Noeud d'origine ( pour la m�thode ajouter segment. )
	
	private DrawingPane drawableGrid;		//  Surface graphique �ditable ( visualisation )
	private JScrollPane scrollPane;		//  Conteneur pour le scrolling
	private JViewport vport;
	private Point p;
	
	private JPopupMenu menu; // Menu Contextuel clic-droit.
	private JMenuItem addNodeMenu;
	private JMenuItem delete;
	private JMenuItem addUrgence;
	private JMenuItem addVehicule;
	
	private GestionnaireSimulateur controlleur;
	private GestionnaireSimulateur controlleurCopy;
	
	//tableau pour le undo redo
	int index = 0;
	final int INDEX_MAX = 15;
	GestionnaireSimulateur [] undo_redo = new GestionnaireSimulateur [INDEX_MAX + 1];
	
	private Noeud _noeudCliquer;
	private Segment _segmentCliquer;
	private Noeud _noeudSegmentSelectionnee;
	private Noeud _noeudNonCliquer;
	private Noeud _noeudCreerRapidEdit;
	private float force = 1.0f;
	private FenetrePrincipale _fenetrePrincipale;
	
	public  GestionnaireSimulateur getControlleur ()
	{
		return controlleur;
	}
	
	public Boolean getDisplayGrid() {
		return _displayGrid;
	}
	
	public void setDisplayGrid(Boolean displayGrid) {
		_displayGrid = displayGrid;
		this.repaint();
	}
	
	public void playSim()
	{
		controlleurCopy = controlleur.clone();
	}
	
	public void resetSim()
	{
		if (controlleurCopy != null)
		{
			controlleur = controlleurCopy.clone();
		}
	}
	
	public void setundo_redo()
	{
		index++;
		if (index > INDEX_MAX)
		{
			index = INDEX_MAX;
			for(int i = 0; i < undo_redo.length - 1; i++)
			{
				undo_redo[i] = undo_redo[i + 1].clone();
			}
		}
		undo_redo[index] = controlleur.clone();
	}
	
	public void undo()
	{
		index--;
		if (index < 0)
		{
			index = 0;
		}
		controlleur = undo_redo[index].clone();
		this.controlleur.setMode(GestionnaireSimulateur.ModeEdition.NONE);
	}
	
	public void redo()
	{
		index++;
		if (undo_redo[index] == null)
		{
			index--;
		}
		else
		{
			if (index > INDEX_MAX)
			{
				index = INDEX_MAX;
			}
			controlleur = undo_redo[index].clone();
			this.controlleur.setMode(GestionnaireSimulateur.ModeEdition.NONE);
		}
	}
	
	/*
	 * *
	 * * M�thodes
	 * *
	 */

	
    /** Le composant � l'int�rieur du JPanel, Surface de peinture.
     *  Il consiste juste dans la surcharge de la m�thode de peinture
     *  Il n'est donc pas n�cessaire dans faire une classe � part ( elle
     *  utilise les m�me attributs que la classe GrilleMagn�tique ). */
    public class DrawingPane extends JLabel {
    	

    	
        /**
		 * 
		 */
		private static final long serialVersionUID = 8800809707358375472L;

		protected void paintComponent(Graphics g)
		{
            super.paintComponent(g);
            
            Graphics2D imageCopier = (Graphics2D) g;
            imageCopier.scale(force, force);
           
            if (_displayGrid) { 
	            Stroke oldStroke = imageCopier.getStroke();
	            
	            Stroke dotted = new BasicStroke(0.5f, BasicStroke.CAP_BUTT, BasicStroke.CAP_SQUARE, 0, new float[] {1,1}, 0);
	            imageCopier.setStroke(dotted);
	            g.setColor(Color.LIGHT_GRAY);
	            for (int w = 0; w <= this.getWidth()/force; w+=10) {
	            	g.drawLine(w, 0, w, (int) ((int)this.getHeight()/force));
	            }
	            
	            for (int h = 0; h <= this.getHeight()/force; h+=10) {
	            	g.drawLine(0, h, (int) (this.getWidth()/force), h);
	            }
	            imageCopier.setStroke(oldStroke);
            }
            

            ArrayList<Noeud> nodes = controlleur.getReseau().getListeNoeuds();
            for(Noeud r : nodes){
            	// Affichage des noeuds.
            	// Il est toujours moyen de sotcker les Rectangle dans un vecteur si on veut les modifier par la suite.
            	// Par exemple pour les surligner ...
            	
            	if (r.possedeUrgenceActive()) {
            		g.setColor(Color.RED);
            	} else {
            		g.setColor(Color.BLACK);
            	}
                
                //g.fillOval(r.getX() - 5, r.getY() - 5, L * (int)force , H * (int)force );
            	g.fillOval(r.getX() - 5, r.getY() - 5, L, H);
            	
                g.setColor(Color.BLACK);
                // Affichage des segments.
                ArrayList<Segment> segments = controlleur.getReseau().getListeSegments();
                for(Segment s : segments){
                	int x1 = s.getNoeudDepart().getX();
                	int y1 = s.getNoeudDepart().getY();
                	int x2 = s.getNoeudFin().getX();
                	int y2 = s.getNoeudFin().getY();
                	//g.drawLine(x1 + (int)force, y1 + (int)force, x2 + (int)force, y2 + (int)force);
                	g.drawLine(x1, y1, x2, y2);
                }
                
         
            }
            
            VehiculeUrgence vehicule = controlleur.getReseau().getVehiculeUrgence();
            if (vehicule != null) {
            	g.setColor(Color.BLUE);
            	//g.fillRect(vehicule.getCoordonnee().x - 5, vehicule.getCoordonnee().y - 5, L * (int)force, H * (int)force);
            	g.fillRect(vehicule.getCoordonnee().x - 5, vehicule.getCoordonnee().y - 5, L, H);
            }
            
           

                      
        }
    }
   

	public GrilleMagnetique(GestionnaireSimulateur c, int rows, int cols, FenetrePrincipale fenetrePrincipale)
	{
		super(new BorderLayout());
		
		_fenetrePrincipale = fenetrePrincipale;
		
		this.COL = cols;
		this.ROWS = rows;
		
		this.controlleur = c;
		this.p = new Point(); // Utilis� pour les events de souris.
		//this.nodes = new ArrayList<Rectangle>();
		
		// Initialisation de la surface de dessin
		this.drawableGrid = new DrawingPane();
		// Initialisation des couleurs.
		this.drawableGrid.setBackground(Color.WHITE);
		this.drawableGrid.setOpaque(true);
		// Init de la taille de la grille dessinable ( test )
		this.drawableGrid.setSize(new Dimension(800, 600));
		this.drawableGrid.setPreferredSize(new Dimension(800,600));
		// Ajout du listener pour les event de souris ( placement, drag ... )
		this.drawableGrid.addMouseListener(this);
		this.drawableGrid.addMouseMotionListener(this);
		this.drawableGrid.addMouseWheelListener(this);
		
		this.hDist = this.drawableGrid.getHeight() / this.ROWS;
		this.lDist = this.drawableGrid.getWidth() / this.COL;
		
		// Ajout du Viewport ( n�cessaire pour le scrolling )
		this.vport = new JViewport();
		this.vport.add(this.drawableGrid);
		this.vport.addMouseMotionListener(this);
		this.vport.addMouseListener(this);

		this.scrollPane = new JScrollPane();
		this.scrollPane.setViewport(vport);
		
		// On supprime les bordures.
		this.scrollPane.setBorder(BorderFactory.createEmptyBorder());
		
		this.add(this.scrollPane, BorderLayout.CENTER);
		
		// D�finition du menu en cas de clic droit.
		this.menu = new JPopupMenu();
		this.addNodeMenu = new JMenuItem("Ajouter noeud");
		this.delete = new JMenuItem("Supprimer");
		this.addUrgence = new JMenuItem("Ajouter urgence");
		this.addVehicule = new JMenuItem("Ajouter v�hicule");
		this.menu.add(this.addNodeMenu);
		this.menu.add(this.addUrgence);
		this.menu.add(this.addVehicule);
		this.menu.addSeparator();
		this.menu.add(this.delete);
		
			
		this.addNodeMenu.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				{
					setundo_redo();
					drawableGrid.repaint();
				}
			}	
		});
					
					
		this.delete.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Noeud n = controlleur.getNodeByCoordinate((int) p.getX(),(int) p.getY());
				if(n != null){
					setundo_redo();
					ArrayList<Segment> ls = controlleur.getSuccesseurs(n);
					for(Segment s: ls){
						controlleur.supprimerSegment(s);
					}
					controlleur.supprimerNoeud(n);
					//nodes.remove(new Rectangle((int) n.getX()-5, (int) n.getY()-5, H, L));
					drawableGrid.repaint();
				}
			}	
		});
		
		this.addUrgence.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				Noeud n = controlleur.getNodeByCoordinate((int) p.getX(),(int) p.getY());
				if(n != null){
					setundo_redo();
					// Cr�ation de la fen�tre de GUI pour ajoutUrgence.
					FenetreAjoutUrgence ajoutUrgenceGui;
					ajoutUrgenceGui = new FenetreAjoutUrgence(controlleur, n);
					ajoutUrgenceGui.setVisible(true);
					drawableGrid.repaint();
				}				
			}	
		});
		
		this.addVehicule.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				Noeud n = controlleur.getNodeByCoordinate((int) p.getX(),(int) p.getY());
				if(n != null){
					setundo_redo();
					VehiculeUrgence vehicule = controlleur.getReseau().getVehiculeUrgence();
					
					if (vehicule == null) {
						vehicule = new VehiculeUrgence(n);
						controlleur.getReseau().setVehiculeUrgence(vehicule);
					}
					vehicule.setPortAttache(n);
					vehicule.setCoordonnee(n.getCoordonee());
					drawableGrid.repaint();
					
				}				
			}	
		});
		
		this.controlleur.addSimulationListener(new SimulationListener() {
			
			@Override
			public void simulationChange() {
				
				drawableGrid.repaint();
			}
		});
		
	}
	
	public Point magnetize(int x, int y) {
		
		// Calcul "magn�tique" pour placer correctement les noeuds.
		int sRow = (int) (x/ (this.hDist*force) +1);
        int sCol = (int) (y/ (this.lDist*force) +1);

        
        
        int sx =  (int) (((sRow * this.hDist) - (this.hDist / 2)));
        int sy =  (int) (((sCol * this.lDist) - (this.lDist / 2)));
        
//        Point2D p;
//		try {
//			p = _trans.inverseTransform(new Point2D.Double(sx, sy), null);
//			return new Point((int)p.getX(), (int)p.getY());
//		} catch (NoninvertibleTransformException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
        
		return new Point(sx, sy);
	}
	

	
	public void ajouterNoeud(int x, int y) {

        Point c = magnetize(x, y);

        //this.nodes.add(new Rectangle((int) c.getX()-5, (int) c.getY()-5, this.H, this.L));
        this.controlleur.ajouterNoeud(((int) c.getX()), ((int) c.getY()));
	}
	
	// M�thode affichage menu clic droit.
	void afficherMenuContextuel(MouseEvent e){
		if(this.controlleur.getMode() == GestionnaireSimulateur.ModeEdition.NONE){
			if(e.isPopupTrigger()){
				this.menu.show(e.getComponent(), e.getX(), e.getY());
			}
		}
	}
	
	
	@Override
	public void mouseClicked(MouseEvent e) {

	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		this.p = this.magnetize(e.getX(), e.getY());
		
		//valider le dblclick
		if (e.getClickCount() == 2 && !e.isConsumed()) 
		{
		     e.consume();
		
			//�diter les coordonn�es d'un noeud
			if(this.controlleur.exists(p.getLocation()))
			{
				String coordonnees = new String(JOptionPane.showInputDialog(this._fenetrePrincipale,"Veuillez indiquer les coordonn�es du noeud (X,Y)","Coordonn�e du noeud",JOptionPane.OK_CANCEL_OPTION));
				if (coordonnees != null && coordonnees != "")
				{
					//modifier les coodonn�es du Noeud
					String newCoordonnees[] = coordonnees.split(",");
					if (newCoordonnees.length > 1)
					{
						if (estNumerique(newCoordonnees[0]) && estNumerique(newCoordonnees[1]))
						{
							if (Integer.parseInt(newCoordonnees[0]) >= 0 && Integer.parseInt(newCoordonnees[1]) >= 0)
							{
								setundo_redo();
								this.controlleur.getNodeByCoordinate(p.x, p.y).setCoordonnee(new Point(Integer.parseInt(newCoordonnees[0]),Integer.parseInt(newCoordonnees[1])));
								this.drawableGrid.repaint();
							}
						}
					}
				}
			}
		}
		
		//obtenir le noeud cliqu�
		if (this.controlleur.getMode() == GestionnaireSimulateur.ModeEdition.MOVE_NOEUD)
		{
			if(this.controlleur.exists(p.getLocation()))
			{
				_noeudCliquer = controlleur.getNodeByCoordinate(p.x, p.y);
			}
			else
			{
				_noeudCliquer = null;
			}
		}
		
		//obtenir le segment slectionn�
		if (this.controlleur.getMode() == GestionnaireSimulateur.ModeEdition.MOVE_SEGMENT)
		{
			_segmentCliquer = null;
			
			//valider si le clique est effectu� sur un segment
			ArrayList<Segment> segments = controlleur.getReseau().getListeSegments();
			for (int i = 0; i < segments.size(); i++)
			{
            	//obtenir la distance entre le point de depart et la souris
            	float distance = Noeud.calculerDistanceEntreDeuxPoints(new Point(segments.get(i).getNoeudDepart().getX(),segments.get(i).getNoeudDepart().getY()), p);
            	
            	//Obtenir le point du segment entre le depart et le noeud de fin avec la distance trouv�
            	Point pointLine = Noeud.obtenirCoordonneeDistance(new Point(segments.get(i).getNoeudDepart().getX(),segments.get(i).getNoeudDepart().getY()), segments.get(i).getNoeudFin(), distance);
            	
            	
            	//Comparer les deux points avec le buffer
            	if ((p.x + 10 > pointLine.x && p.x - 10 < pointLine.x) && (p.y + 10 > pointLine.y && p.y - 10 < pointLine.y))
            	{
            		//segment s�lectionn�
            		_segmentCliquer = segments.get(i);
            		i = segments.size();
            		
            		//obtenir le noeud cliquer sinon prendre le noeud de d�part par d�faut
            		if (this.controlleur.getNodeByCoordinate((int) p.getX(), (int) p.getY()) != null)
            		{
            			_noeudSegmentSelectionnee = this.controlleur.getNodeByCoordinate((int) p.getX(), (int) p.getY());
            			if (_segmentCliquer.getNoeudDepart().getX() == _noeudSegmentSelectionnee.getX() && _segmentCliquer.getNoeudDepart().getY() == _noeudSegmentSelectionnee.getY()) 
            			{
            				_noeudNonCliquer = _segmentCliquer.getNoeudFin();
            			}
            			else
            			{
            				_noeudNonCliquer = _segmentCliquer.getNoeudDepart();
            			}
            		}
            		else
            		{
            			_noeudSegmentSelectionnee = _segmentCliquer.getNoeudDepart();
            			_noeudNonCliquer = _segmentCliquer.getNoeudFin();
            		}
            	}
			}
		}
		
		this.afficherMenuContextuel(e);
	}

	@Override
	public void mouseReleased(MouseEvent e) 
	{
		if (e.getButton() == MouseEvent.BUTTON2)
		{
			//reset mode 
			this.controlleur.setMode(GestionnaireSimulateur.ModeEdition.NONE);
		}
			
		Point c = this.magnetize(e.getX(), e.getY());
		this.afficherMenuContextuel(e);
		
		if (this.controlleur.getMode() == GestionnaireSimulateur.ModeEdition.RAPID_EDIT)
		{
			//creer un point
			if(c.getX() == p.getX() && c.getY() == c.getY())
			{
				// Si le noeud n'existe pas.
				if(!this.controlleur.exists(p.getLocation()))
				{
					setundo_redo();
					this.ajouterNoeud(e.getX(), e.getY());
				}
			}
			
			//obtenir le noeud cr��
			_noeudCreerRapidEdit = this.controlleur.getNodeByCoordinate(p.x, p.y);
				
			//parcourrir tous les noeuds et les li�s au nouveau noeud par un segment
			ArrayList<Noeud> listeNoeuds = this.controlleur.getReseau().getListeNoeuds();
			
			if (listeNoeuds.size() > 1)
			{
				for (int i = 0; i < listeNoeuds.size(); i++)
				{
					try
					{
						if (_noeudCreerRapidEdit != listeNoeuds.get(i))
						{
							this.controlleur.getReseau().ajoutSegment(new Segment(_noeudCreerRapidEdit, listeNoeuds.get(i)));
						}
					}
					catch (ObjetExistantError err)
					{
						//msg d'erreur
					}
				}
			}
			this.drawableGrid.repaint();
			
		}
		else if (this.controlleur.getMode() == GestionnaireSimulateur.ModeEdition.MOVE_SEGMENT)
		{
			//valider si un noeud existe on l'assigne sinon on retourne le segment comme il �tait
			if(!this.controlleur.exists(c))
			{
				if (_segmentCliquer.getNoeudDepart() != _noeudNonCliquer)
				{
					_segmentCliquer.setNoeudDepart(_noeudSegmentSelectionnee);
				}
				else
				{
					_segmentCliquer.setNoeudFin(_noeudSegmentSelectionnee);
				}
				this.drawableGrid.repaint();
			}
			else
			{
				setundo_redo();
				if (_segmentCliquer.getNoeudDepart() != _noeudNonCliquer)
				{
					_segmentCliquer.setNoeudDepart(controlleur.getNodeByCoordinate((int)c.getX(), (int)c.getY()));
				}
				else
				{
					_segmentCliquer.setNoeudFin(controlleur.getNodeByCoordinate((int)c.getX(), (int)c.getY()));
				}
				this.drawableGrid.repaint();
			}
			this.controlleur.setMode(GestionnaireSimulateur.ModeEdition.NONE);
		}
		else if (this.controlleur.getMode() == GestionnaireSimulateur.ModeEdition.MOVE_NOEUD)
		{
			this.controlleur.setMode(GestionnaireSimulateur.ModeEdition.NONE);
		}
		else if (this.controlleur.getMode() == GestionnaireSimulateur.ModeEdition.DEL_SEGMENT)
		{
			//valider si le clique est effectu� sur un segment
			ArrayList<Segment> segments = controlleur.getReseau().getListeSegments();
			for (int i = 0; i < segments.size(); i++){
            	//obtenir la distance entre le point de depart et la souris
            	float distance = Noeud.calculerDistanceEntreDeuxPoints(new Point(segments.get(i).getNoeudDepart().getX(),segments.get(i).getNoeudDepart().getY()), c);
            	
            	//Obtenir le point du segment entre le depart et le noeud de fin avec la distance trouv�
            	Point pointLine = Noeud.obtenirCoordonneeDistance(new Point(segments.get(i).getNoeudDepart().getX(),segments.get(i).getNoeudDepart().getY()), segments.get(i).getNoeudFin(), distance);
            	
            	//Comparer les deux points avec le buffer
            	if ((c.x + 10 > pointLine.x && c.x - 10 < pointLine.x) && (c.y + 10 > pointLine.y && c.y - 10 < pointLine.y))
            	{
            		//segment s�lectionn�
            		setundo_redo();
            		this.controlleur.supprimerSegment(segments.get(i));
            		this.drawableGrid.repaint();
            		i = segments.size();
            	}
            	// On repasse en mode normal.
				this.controlleur.setMode(GestionnaireSimulateur.ModeEdition.NONE);
            }
			
		}
		// Ajout d'un noeud si l'on est en mode AJOUT_NOEUD
		else if(this.controlleur.getMode() == GestionnaireSimulateur.ModeEdition.AJOUT_NOEUD){
			// On v�rifie que le curseur est au m�me endroit.
			if(c.getX() == p.getX() && c.getY() == c.getY()){
				// Si le noeud n'existe pas.
				if(!this.controlleur.exists(p.getLocation())){
					setundo_redo();
					this.ajouterNoeud(e.getX(), e.getY());
					this.drawableGrid.repaint();
				}

				// On repasse en mode normal.
				this.controlleur.setMode(GestionnaireSimulateur.ModeEdition.NONE);

			}
		}
		else if (this.controlleur.getMode() == GestionnaireSimulateur.ModeEdition.AJOUT_SEGMENT){

			// Si il existe un noeud ou l'on a cliqu�
			if(this.controlleur.exists(c)){
			
				// Si on a pas selectionn� de noeud d'origine. Alors celui l� est selectionn�.
				if(this.oNode == null){

					this.oNode = this.controlleur.getNodeByCoordinate((int) c.getX(), (int) c.getY());

				}else{
					// Sinon on est en train de choisir le noeuds d'arriv�e, donc on dessine le segment.
					if(!(c.getX() == this.oNode.getX() && c.getY() == this.oNode.getY())){
						// On v�rifie qu'on ne clique pas deux fois sur le m�me noeud
						// Ni deux fois le m�me segments.
						if(!(this.controlleur.exists(new Segment(this.oNode, this.controlleur.getNodeByCoordinate((int) c.getX(), (int) c.getY()))))){
							// On ajoute le segment.
							setundo_redo();
							this.controlleur.ajouterSegment(this.oNode, this.controlleur.getNodeByCoordinate((int) c.getX(), (int) c.getY()));
							this.oNode = null;
							this.drawableGrid.repaint();
							// On retire le mode, on unset oNode.
							this.controlleur.setMode(GestionnaireSimulateur.ModeEdition.NONE);
						}
					}
				}
			}
		}
	}



	@Override
	public void mouseDragged(MouseEvent e) 
	{
		Point c = this.magnetize(e.getX(), e.getY());
		
		if (this.controlleur.getMode() == GestionnaireSimulateur.ModeEdition.MOVE_NOEUD)
		{
			if (_noeudCliquer != null)
			{
				_noeudCliquer.setCoordonnee(c);
				drawableGrid.repaint();
			}
		}
		
		if (this.controlleur.getMode() == GestionnaireSimulateur.ModeEdition.MOVE_SEGMENT)
		{
			if (_segmentCliquer != null)
			{
				Noeud noeudTemp = new Noeud(_segmentCliquer.getNoeudDepart().getCoordonee());
				noeudTemp.setCoordonnee(c);
				if (_segmentCliquer.getNoeudDepart() != _noeudNonCliquer)
				{
					_segmentCliquer.setNoeudDepart(noeudTemp);
				}
				else
				{
					_segmentCliquer.setNoeudFin(noeudTemp);
				} 
				
				drawableGrid.repaint();
			}
		}
		
	}



	@Override
	public void mouseMoved(MouseEvent e) {
		
	}
	
	@Override
	public void mouseWheelMoved(MouseWheelEvent e) 
	{
	    int direction = e.getWheelRotation();
	    
	    if(direction == 1)
	    {
	    	force += (float)direction / 5.0f;
	    	if (force > 1.5f)
			{
				force = 1.5f;
			}
		}
		else 
		{
			force += (float)direction / 5.0f;;
			if (force < 0.5f)
			{
				force = 0.5f;
			}
		}
	    
	    this.drawableGrid.repaint();
	  }
	
	public boolean estNumerique(String string) {
		try
		{
			Integer.parseInt(string);
		} catch (NumberFormatException e){
			return false;
		}
 
		return true;
	}
	
	
}

